import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import 抽象语法树类.程序节点;
import 抽象语法树遍历器.*;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class 测试工具 {
    public static 程序节点 解析(String 源码) {
        // 1. 构造抽象语法树
        var input = CharStreams.fromString(源码);
        var lexer = new PieLexer(input);// 词法分析器，将输入文本转换为词法符号
        var tokens = new CommonTokenStream(lexer);// 词法符号流
        var parser = new PieParser(tokens);// 语法分析器
        var 树 = new 语法树访问器().visit(parser.program());

        // 2. 设置父节点
        var 遍历器 = new 抽象语法树遍历器();
        遍历器.遍历(new 父节点监听器(), 树);

        // 3. 定义符号
        遍历器.遍历(new 符号定义器(), 树);

        return (程序节点) 树;
    }

    public static void 分割线() {
        System.out.println("--------------------------------------------------");
    }

    public static 解释器 解释并执行(String 源码) {
        var 入口点 = 解析(源码);
        分割线();
        var 解释器 = new 解释器();
        解释器.解释(入口点);
        return 解释器;
    }

    public static boolean 浮点相等(float a, float b) {
        return Math.abs(a - b) < 0.00001;
    }

    public static String 读测试资源(String 文件名) {
        try {
            return 读文件(Tools.getResourcePath(文件名));
        } catch (Exception e) {
            throw new RuntimeException();
        }
    }

    public static String 读文件(String 文件名) throws IOException, URISyntaxException {
        var uri = new URI("file", null, 文件名, null);
        return Files.readString(Paths.get(uri));
    }
}
